package org.study.springboot.learning.reflect;

import java.lang.reflect.Field;

/**
 * <p>Title: FieldExample <p>
 * <p>Description: TODO<p>
 *
 * @Author ZhangSY
 * @Date 2021/6/20 13:01
 * @Version v1.0
 **/
public class FieldExample {
    public static void main(String[] args) throws Exception
    {
        Class<?> c = Class.forName("com.xrq.test19.Reflection");
        Reflection r = new Reflection();
        Field f0 = c.getField("b");
        Field f1 = c.getDeclaredField("d");
        Field[] fs0 = c.getFields();
        Field[] fs1 = c.getDeclaredFields();

        System.out.print("Class.getFields()："); // 获取类中所有public字段,顺序即public的Field定义的顺序
        for (Field f : fs0)
            System.out.print(f + "\t");

        System.out.println();
        System.out.print("Class.getDeclaredFields()："); // 获取类中任意访问权限的字段,顺序即所有Field定义的顺序
        for (Field f : fs1)
            System.out.print(f + "\t");

        System.out.println();
        System.out.println("Class.getField(String name)：" + f0); // 根据name获取类中一个访问权限为public的字段
        System.out.println("Class.getDeclaredField(String name)：" + f1); // 根据name获取类中一个任意访问权限的字段

        System.out.println();
        System.out.println("Field.getName()：" + f0.getName()); // 获取字段名
        System.out.println("Field.getType()：" + f0.getType()); // 获取类的类型
        System.out.println("Field.getBoolean()：" + f0.getBoolean(r));    // 获取某个实例对象该Field的值，什么类型的Field就是getXXX(Object obj)
        System.out.println("Field.getModifiers()：" + f0.getModifiers()); // 以整数形式返回此Field对象的Java语言修饰符，如public、static、final等
        System.out.println("Field.isAccessible()：" + f0.isAccessible()); // 返回Field的访问权限，对private的Field赋值，必须要将accessible设置为true，如下

        System.out.println();
        f1.setAccessible(true);
        System.out.println("Before setB()：" + r);
        f1.setDouble(r, 1.1);
        System.out.println("After setB()：" + r); // 向对象的指定Field设定值
    }
}
